#pragma once

#include "data_type.hpp"

#pragma pack(1)

struct MIRPHeader
{
    uint8_t flag;            // 标识位和协议版本号。高4位为标识位，低4位为协议版本号
    int8_t type_id;          // 报文类型，即消息类型，唯一代表一个消息种类
    uint16_t length;         // 报文体长度（不包括报文头）
    int32_t packet_no;       // 行情报文编号，唯一标记一个增量行情报文
    int16_t topic_id;        // 行情主题的主题代码
    uint16_t snap_millisec;  // 当前主题行情快照的毫秒级时间
    int32_t snap_no;         // 当前主题增量行情的快照编号
    uint32_t snap_time;      // 当前主题行情快照的秒级时间
    uint16_t comm_phase_no;  // 当前交易日从1980年01月01日开始的天数
    int8_t center_change_no; // 当前数据中心切换编号
    int8_t reserved;         // 保留字节
};

// type_id = 0x00
// 每个心跳消息由一个心跳报文构成。心跳报文为一个MIRP空报文。
struct HeartBeat
{
};

/////////////////增量行情刷新消息 type_id = 0x01////////////////////

// 合约增量行情头域 filed_id = 0x0003
struct InstrumentIncrementalHeader
{
    VInt instrument_no; // 合约编号
    VInt snapshot_no;     // 当前合约增量行情的快照编号
};

// 分价表变动域 filed_id = 0x1001
struct TickTableChangeDomain
{
    char event_type;   // 事件类型。取值范围为：‘1’：增加 ‘2’：修改 ‘3’：删除
    char entry_type;   // 买卖方向。取值范围为：‘0’：bid ‘1’：ask
    VInt price_level;  // 档位深度。从1开始依次递增，表明对分价表的第几档进行操作
    VInt price_offset; // 档位价格。编码中的值为实际价格相对于对应主题行情快照中的编解码基准价有多少个最小变动价位的偏移
    VInt volume;       // 报单量
};

// 成交概要 filed_id = 0x1002
struct TransactionSummary
{
    VInt last_price_offset;    // 最新价偏移量。编码方式和意义同分价表变动事件中的档位价格的编码
    VInt volume_change;        // 成交量变化。实际成交量相对于上一个合约行情快照中的成交量的变化
    VInt turnover_offset;      // 成交额偏移量。假设该值为n，则实际成交额=(原成交额)+((成交量-原成交量)* (编解码基准价)+ n*(最小变动价位))*(合约乘数)
    VInt open_interest_change; // 持仓量变化。实际持仓量相对于上一个合约行情快照中持仓量的变化
};

// 最高价域 filed_id = 0x1011
struct HighestPrice
{
    VInt high_price_offset; // 最高价偏移量。编码方式和意义同分价表变动事件中的档位价格的编码。
};

// 最低价域 filed_id = 0x1012
struct LowestPrice
{
    VInt low_price_offset; // 最低价偏移量。编码方式和意义同分价表变动事件中的档位价格的编码。
};

// 开盘价域 filed_id = 0x1013
struct OpenPrice
{
    VInt open_price_offset; // 开盘价偏移量。编码方式和意义同分价表变动事件中的档位价格的编码。
};

// 收盘价域 filed_id = 0x1014
struct ClosePrice
{
    VInt close_price_offset; // 收盘价偏移量。编码方式和意义同分价表变动事件中的档位价格的编码。
};

// 涨停板价域 filed_id = 0x1015
struct UpperLimitPrice
{
    VInt upper_limit_price_offset; // 涨停板价偏移量。编码方式和意义同分价表变动事件中的档位价格的编码。
};

// 跌停板 filed_id = 0x1016
struct LowerLimitPrice
{
    VInt lower_limit_price_offset; // 跌停板价偏移量。编码方式和意义同分价表变动事件中的档位价格的编码。
};

// 结算价域 filed_id = 0x1017
struct SettlementPrice
{
    VInt settlement_price_offset; // 结算价偏移量。编码方式和意义同分价表变动事件中的档位价格的编码。
};

// 虚实度域 filed_id = 0x1018
struct CurrDelta{
    Double curr_delta; // 今虚实度
};

// 买报单统计信息变动域 filed_id = 0x1019
struct BidOrderStatChangeDomain
{
    VInt bid_volume_change;    // 买报单总量变化。实际买报单总量相对于上一个合约行情快照中的买报单总量的变化
    VInt bid_amount_change;    // 买报单总金额变化。实际买报单总金额相对于上一个合约行情快照中的买报单总金额的变化
};

// 卖报单统计信息变动域 filed_id = 0x101A
struct AskOrderStatChangeDomain
{
    VInt ask_volume_change;    // 卖报单总量变化。实际卖报单总量相对于上一个合约行情快照中的卖报单总量的变化
    VInt ask_amount_change;    // 卖报单总金额变化。实际卖报单总金额相对于上一个合约行情快照中的卖报单总金额的变化
};

#pragma pack()
